package com.czr.dao.service.impl;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czr.dao.entity.CzrLike;
import com.czr.dao.entity.CzrPost;
import com.czr.dao.entity.CzrReply;
import com.czr.dao.entity.CzrUser;
import com.czr.dao.mapper.CzrLikeMapper;
import com.czr.dao.mapper.CzrReplyMapper;
import com.czr.dao.mapper.CzrUserMapper;
import com.czr.dao.service.CzrPostService;
import com.czr.dao.service.CzrReplyService;
import com.czr.dto.DelReplyParam;
import com.czr.dto.ReplyListParam;
import com.czr.util.DateUtils;
import com.czr.util.PageUtil;
import com.czr.util.TencentCosUtil;
import com.czr.vo.CzrReplyVo;
import com.czr.vo.Result;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * <p>
 * 回复 服务实现类
 * </p>
 */
@Service
public class CzrReplyServiceImpl extends ServiceImpl<CzrReplyMapper, CzrReply> implements CzrReplyService {



    @Autowired
    public CzrUserMapper czrUserMapper;


    @Autowired
    public CzrLikeMapper czrLikeMapper;

    @Autowired
    public CzrReplyMapper czrReplyMapper;

    @Autowired
    public CzrPostService czrPostService;

    @Override
    public Result<Object> czrReply(CzrReply czrReply) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //判断回复级别
        if(!StringUtils.isEmpty(czrReply.getPostId())){
            CzrPost czrPost=czrPostService.getById(czrReply.getPostId());
            czrReply.setOldUserId(Integer.parseInt(czrPost.getUserId().toString()));
            czrReply.setLevel(1);
        }
        if(!StringUtils.isEmpty(czrReply.getReplyId())){
            CzrReply czrReply1=czrReplyMapper.selectById(czrReply.getReplyId());
            if(!StringUtils.isEmpty(czrReply)){
                czrReply.setOldReplyId(czrReply.getReplyId());
                czrReply.setPostId(czrReply1.getPostId());
                if(!StringUtils.isEmpty(czrReply1.getReplyId())){
                    czrReply.setReplyId(czrReply1.getReplyId());
                }else{
                    czrReply.setReplyId(Integer.parseInt(czrReply1.getId().toString()));
                }

            }else{
                return Result.fail("评论不存在！");
            }
            czrReply.setLevel(czrReply1.getLevel()+1);
            czrReply.setOldUserId(czrReply1.getUserId());
        }
        czrReply.setPubTime(format.format(new Date()));
        czrReply.setLikeCount(0);
        czrReply.setStatus(0);
        boolean resultBoolen = czrReply.insert();
        if (resultBoolen) {
            return Result.success(200, "回帖成功！");
        } else {
            return Result.fail("回帖失败！");
        }
    }

    @Override
    public Result<Object> replyList(ReplyListParam replyListParam, Integer userId) throws Exception {
        TencentCosUtil tencentCosUtil=new TencentCosUtil();
        Page<CzrReply> page = new Page<>();
        page.setSize(replyListParam.getSize());
        page.setCurrent(replyListParam.getCurrent());
        LambdaQueryWrapper<CzrReply> ew = new LambdaQueryWrapper<>();
        ew.eq(CzrReply::getPostId, replyListParam.getPostId());
        ew.eq(CzrReply::getLevel, 1);
        ew.orderByAsc(CzrReply::getPubTime);
        page = this.getBaseMapper().selectPage(page, ew);
        JSONArray jsonArray = new JSONArray();
        for (CzrReply czrReply : page.getRecords()) {
            CzrReplyVo czrReplyVo = new CzrReplyVo();
            BeanUtils.copyProperties(czrReply, czrReplyVo);
            //查询回帖用户
            Map<String, Object> map = czrUserMapper.getUserInfo(Long.parseLong(czrReply.getUserId().toString()));
            if (!StringUtils.isEmpty(map)) {
                czrReplyVo.setNickName(map.get("nick_name").toString());
                czrReplyVo.setUserLogo(tencentCosUtil.imgFile_wx(map.get("user_logo").toString()));
            }
            if (userId == null) {
                czrReplyVo.setIsLike(0);
                czrReplyVo.setIsDel(0);
            } else {
                List<CzrLike> czrLikeList = czrLikeMapper.getLikeReplyId(Integer.parseInt(czrReplyVo.getId().toString()), userId);
                if (czrLikeList.size() > 0) {
                    czrReplyVo.setIsLike(1);
                } else {
                    czrReplyVo.setIsLike(0);
                }
            }
            if(!StringUtils.isEmpty(userId) && czrReply.getUserId().equals(userId)){
                czrReplyVo.setIsDel(1);
            }else{
                czrReplyVo.setIsDel(0);
            }
            if (userId != null) {
                CzrUser czrUser = czrUserMapper.selectById(userId);
//                if (czrUser.getUserType() == 1) {
//                    czrReplyVo.setIsDel(1);
//                }
            }
            czrReplyVo.setPubTime(DateUtils.getTimeDescriptionByDate(new Date(),czrReplyVo.getPubTime()));
            //查询所有二级评论
            List<CzrReply> czrReplyList=czrReplyMapper.get2RepalyList(Integer.parseInt(czrReply.getId().toString()));
            czrReplyVo.setCzrReplyVoList(seanReplyList(czrReplyList,userId));
            czrReplyVo.setReplyCount(czrReplyList.size());
            jsonArray.add(czrReplyVo);
        }
        JSONObject object= PageUtil.getPage(jsonArray,page);
        return Result.data(object);
    }

    @Override
    public Result<Object> delReply(DelReplyParam delReplyParam, JSONObject cacheToken) throws Exception {
        CzrReply czrReply=czrReplyMapper.selectById(delReplyParam.getReplyId());
        if(!czrReply.getUserId().equals(cacheToken.getInteger("id")) && cacheToken.getInteger("user_type").equals(0)){
            return Result.success(201, "该回复非本用户回复，无法删除！");
        }
        Boolean b=czrReply.deleteById(delReplyParam.getReplyId());
        if(b){
            return Result.success(200, "删除成功！");
        }else{
            return Result.success(201, "删除失败！");
        }
    }

    public List<CzrReplyVo> seanReplyList(List<CzrReply> czrReplyList,Integer userId) throws Exception {
        TencentCosUtil tencentCosUtil=new TencentCosUtil();
        List<CzrReplyVo> czrReplyVoList=new ArrayList<>();
        for (CzrReply czrReply :czrReplyList) {
            CzrReplyVo czrReplyVo = new CzrReplyVo();
            BeanUtils.copyProperties(czrReply, czrReplyVo);
            //查询回帖用户
            Map<String, Object> map = czrUserMapper.getUserInfo(Long.parseLong(czrReply.getUserId().toString()));
            if (!StringUtils.isEmpty(map)) {
                czrReplyVo.setNickName(map.get("nick_name").toString());
                czrReplyVo.setUserLogo(tencentCosUtil.imgFile_wx(map.get("user_logo").toString()));
            }
            //当级别大于2级事，增加@展示
            if(czrReply.getLevel()>2){
                Map<String, Object> map2 = czrUserMapper.getUserInfo(Long.parseLong(czrReply.getOldUserId().toString()));
                if (!StringUtils.isEmpty(map2)) {
                    czrReplyVo.setOldNickName(map2.get("nick_name").toString());
                    czrReplyVo.setOldUserLogo(tencentCosUtil.imgFile_wx(map2.get("user_logo").toString()));
                }
            }
            if (userId == null) {
                czrReplyVo.setIsLike(0);
                czrReplyVo.setIsDel(0);
            } else {
                List<CzrLike> czrLikeList = czrLikeMapper.getLikeReplyId(Integer.parseInt(czrReplyVo.getId().toString()), userId);
                if (czrLikeList.size() > 0) {
                    czrReplyVo.setIsLike(1);
                } else {
                    czrReplyVo.setIsLike(0);
                }
            }
            if(!StringUtils.isEmpty(userId) && czrReply.getUserId().equals(userId)){
                czrReplyVo.setIsDel(1);
            }else{
                czrReplyVo.setIsDel(0);
            }
            CzrUser czrUser=czrUserMapper.selectById(userId);
//            if(!StringUtils.isEmpty(czrUser) && czrUser.getUserType()==1){
//                czrReplyVo.setIsDel(1);
//            }
            czrReplyVo.setPubTime(DateUtils.getTimeDescriptionByDate(new Date(),czrReplyVo.getPubTime()));
            czrReplyVoList.add(czrReplyVo);
        }
        return czrReplyVoList;
    }
}
